package nl.dxn.tunnel.server;

import nl.dxn.tunnel.server.config.ProxyConfig;
import org.lionsoul.ip2region.xdb.Searcher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;

public class IPUtils {
    private static Searcher searcher;
    private static final Logger logger = LoggerFactory.getLogger(ServerApp.class);

    /**
     * 根据 IP 地址从 ip2region.db 中获取地理位置
     * //searchIpInfo 的数据格式： 国家|区域|省份|城市|ISP
     * @param ip IP 地址
     * @return IP归属地
     */
    public static String getCityInfo(String ip) {
        try {
            if(searcher == null)
            {
                byte[] bytes = null;
                File file = new File(Constants.getContextPath(),"/config/ip2region.xdb");
                if(file.exists()) {
                    logger.info("加载ip2region文件地址：{}",file.getPath());
                    try (FileInputStream fis = new FileInputStream(file)) {
                        bytes = new byte[fis.available()];
                        fis.read(bytes);
                    } catch (Exception e) {
                        logger.error("",e);
                    }
                }
                else
                {
                    InputStream resource = ClassLoader.getSystemResourceAsStream("server.yml");
                    if (resource != null) {
                        logger.info("加载ip2region文件地址：getSystemResourceAsStream,ip2region.xdb");
                        bytes = new byte[resource.available()];
                        resource.read(bytes);
                    }
                }

                // 创建一个完全基于内存的查询对象
                searcher = Searcher.newWithBuffer(bytes);
            }
            return searcher.search(ip);
        } catch (Exception e) {
            logger.error("ip地址查询异常：",e);
        }
        return null;
    }

    /**
     * 根据 IP 地址返回归属地，国内返回但省份，国外返回到国家
     * @return IP 归属地
     */
    public static void main(String[] args) {
        HashMap<String, String> cityInfo = new HashMap<>();
        String searchIpInfo = getCityInfo("164.114.53.60");
        //-------------------------------------------------------
        //searchIpInfo 的数据格式： 国家|区域|省份|城市|ISP
        //192.168.31.160 0|0|0|内网IP|内网IP
        //47.52.236.180 中国|0|香港|0|阿里云
        //220.248.12.158 中国|0|上海|上海市|联通
        //164.114.53.60 美国|0|华盛顿|0|0
        //-------------------------------------------------------
        String[] splitIpInfo = searchIpInfo.split("\\|");
        cityInfo.put("searchInfo", searchIpInfo);
        cityInfo.put("country",splitIpInfo[0]);
        cityInfo.put("region",splitIpInfo[1]);
        cityInfo.put("province",splitIpInfo[2]);
        cityInfo.put("city",splitIpInfo[3]);
        cityInfo.put("ISP",splitIpInfo[3]);

        System.out.println(searchIpInfo);

//        //--------------国内属地返回省份--------------
//        if ("中国".equals(cityInfo.get("country"))){
//            return cityInfo.get("province");
//        }
//        //------------------内网 IP----------------
//        if ("0".equals(cityInfo.get("country"))){
//            if ("内网IP".equals(cityInfo.get("ISP"))){
//                return "";
//            }
//            else return "";
//        }
//        //--------------国外属地返回国家--------------
//        else {
//            return cityInfo.get("country");
//        }
    }

}
